package com.jrx.anytxn.transaction.mapper.ext;

import com.jrx.anytxn.transaction.entity.AmLoanMainInfo;
import com.jrx.anytxn.transaction.entity.AmLoanMainInfoVo;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @author haopu.zheng
 * 贷款信息扩展
 * date: 2019/7/26
 **/
public interface ExtAmLoanMainInfoMapper {

    /**
     * 根据流水号、客户号查询贷款信息
     *
     * @param seqNo      流水号
     * @param customerId 客户id
     * @param tenantId   租户id
     * @return com.jrx.anytxn.transaction.entity.AmLoanMainInfo
     * @author : zhenghaopu
     * date: 2019/9/25
     */
    AmLoanMainInfo selectAmLoanMainInfoBySeq(@Param(value = "seqNo") String seqNo,
                                             @Param(value = "customerId") String customerId,
                                             @Param("tenantId") String tenantId);

    /**
     * 根据订单ID，渠道号，客户ID查询订单信息
     *
     * @param loanId     贷款id
     * @param customerId 客户id
     * @param tenantId   租户id
     * @return com.jrx.anytxn.transaction.entity.AmLoanMainInfo
     * @author fan.yang
     * date: 2019/9/24 0024 下午 14:33
     */
    AmLoanMainInfo selectByLoanIdAndCusId(@Param("loanId") String loanId, @Param("customerId") String customerId,
                                          @Param("tenantId") String tenantId);

    /**
     * 根据贷款ID/合同号 客户号查询贷款信息
     *
     * @param loanId         贷款id
     * @param contractNumber 合同号
     * @param customerId     客户id
     * @return com.jrx.anytxn.transaction.entity.AmLoanMainInfo
     * @author : zhenghaopu
     * date: 2019/9/25
     */
    AmLoanMainInfo selectAmLoanMainInfoByLoanIdOrContractNumber(@Param(value = "loanId") String loanId,
                                                                @Param(value = "contractNumber") String contractNumber,
                                                                @Param(value = "customerId") String customerId,
                                                                @Param("tenantId") String tenantId,
                                                                @Param("channel") String channel);

    /**
     * 根据渠道 用户id 查询贷款信息列表
     *
     * @param channel    渠道
     * @param customerId 客户id
     * @param tenantId   租户id
     * @return java.util.List<java.util.Map < java.lang.String, java.lang.Object>>
     * @author : zhenghaopu
     * date: 2019/9/25
     */
    List<AmLoanMainInfo> selectLoanMainByCondition(@Param("channel") String channel,
                                                   @Param("customerId") String customerId,
                                                   @Param("tenantId") String tenantId);

    /**
     * 根据条件获取贷款数据
     *
     * @param cond 条件
     * @return 贷款数据
     */
    List<AmLoanMainInfo> selectByCondSelectivePage(@Param("cond") AmLoanMainInfo cond, @Param("beginDate") String beginDate, @Param("endDate") String endDate);

    /**
     * 根据条件获取贷款数据
     *
     * @param cond 条件
     * @return 贷款数据
     */
    List<AmLoanMainInfo> selectByCondSelective(@Param("cond") AmLoanMainInfo cond);

    /**
     * 根据请求流水号查询贷款信息
     *
     * @param seqNo
     * @param customerId
     * @param tenantId
     * @return
     */
    AmLoanMainInfo selectBySeqNo(@Param("seqNo") String seqNo,
                                 @Param("customerId") String customerId,
                                 @Param("tenantId") String tenantId);


    /**
     * 根据请求流水号查询贷款信息
     * @param serialNumber
     * @param loanType
     * @param thirdChannel
     * @param tenantId
     * @return
     */
    AmLoanMainInfo selectBySeqNoAndTenantId(@Param("serialNumber") String serialNumber,
                                            @Param("loanType") String loanType,
                                            @Param("thirdChannel") String thirdChannel,
                                            @Param("tenantId") String tenantId);

    /**
     * 根据更新时间获取贷款数据
     *
     * @param endTime
     * @param startTime
     * @return
     */
    List<AmLoanMainInfo> selectByUpdateTimeSelective(@Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * 根据新建时间获取贷款数据
     *
     * @param endTime
     * @param startTime
     * @return
     */
    List<AmLoanMainInfo> selectByCreateTimeSelective(@Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * 根据订单ID查询信息
     *
     * @param loanId     订单ID
     * @param customerId 客户ID
     * @param tenantId   租户ID
     * @return com.jrx.anytxn.transaction.entity.AmLoanMainInfo
     * @author fan.yang
     * date: 2019/12/22 0022 下午 19:04
     */
    AmLoanMainInfo selectByLoanId(@Param("loanId") String loanId, @Param("customerId") String customerId, @Param("tenantId") String tenantId, @Param("channel") String channel);

    /**
     * 根据租户id与订单ID查询订单信息
     *
     * @param loanId   订单id
     * @param tenantId 租户id
     * @return 订单信息
     */
    AmLoanMainInfo selectByLoanIdAndTenantId(@Param("loanId") String loanId, @Param("tenantId") String tenantId);

    /**
     * 根据租户id与客户id列表 查询订单列表
     *
     * @param cusId    客户ID
     * @param tenantId 租户id
     * @return 订单信息
     */
    List<AmLoanMainInfo> selectByCusIdtAndTenantId(@Param("cusId") String cusId,
                                                   @Param("tenantId") String tenantId);

    /**
     * 根据租户id与客户id列表 查询订单列表
     *
     * @param cusId      客户ID
     * @param tenantId   租户id
     * @param productIds 租户id
     * @return 订单信息
     */
    List<AmLoanMainInfo> selectByCusIdtProductIdsAndTenantId(@Param("cusId") String cusId,
                                                             @Param("tenantId") String tenantId,
                                                             @Param("productIds") List<String> productIds);

    int updateByLoanId(AmLoanMainInfo amLoanMainInfo);

    /**
     * 批量更新订单信息（联机可用）
     *
     * @param updateLoanMainInfoList
     * @return
     */
    int batchUpdateLoanMain(List<AmLoanMainInfo> updateLoanMainInfoList);


    /**
     * 批量更新订单信息（批量可用）
     *
     * @param updateLoanMainInfoList
     * @return
     */
    int batchUpdateLoanMainForBatch(List<AmLoanMainInfo> updateLoanMainInfoList);

    AmLoanMainInfo selectByLoanIdAndLoanType(@Param("customerId") String customerId,
                                             @Param("loanId") String loanId,
                                             @Param("tenantId") String tenantId,
                                             @Param("loanType") String loanType);

    void batchInsert(List<AmLoanMainInfo> list);


    List<AmLoanMainInfo> selectByPostingDateForBatch(@Param("postingDate") Date postingDate);

    /**
     * 根据交易时间查询订单id
     *
     * @param postingDate
     * @return List<String>
     * @author liuyang
     * @date 2021-03-22
     */
    List<String> selectLoanIdByPostingDateForBatch(@Param("postingDate") Date postingDate);

    /**
     * 查找指定交易日期的贷款信息
     * @param tenantId
     * @param postingDate
     * @return
     */
    List<AmLoanMainInfo> selectLoanInfoByPostingDate(@Param("tenantId") String tenantId, @Param("postingDate") Date postingDate);

    List<AmLoanMainInfo> selectByPostingDateRangeAndLoanType(@Param("tenantId") String tenantId,
                                                             @Param("customerId") String customerId,
                                                             @Param("channel") String channel,
                                                             @Param("postingDateStart") Date postingDateStart,
                                                             @Param("postingDateEnd") Date postingDateEnd,
                                                             @Param("loanType") String loanType);

    List<AmLoanMainInfo> selectByPostingDateRangeAndLoanTypeProductIds(@Param("tenantId") String tenantId,
                                                             @Param("customerId") String customerId,
                                                             @Param("channel") String channel,
                                                             @Param("postingDateStart") Date postingDateStart,
                                                             @Param("postingDateEnd") Date postingDateEnd,
                                                             @Param("loanType") String loanType,
                                                             @Param("productIds") List<String> productIds);

    int countByBusinessDateAndLoanType(@Param("tenantId") String tenantId,
                                       @Param("businessDate") Date businessDate,
                                       @Param("loanType") String loanType,
                                       @Param("thirdChannel") String thirdChannel);

    BigDecimal sumByBusinessDateAndLoanType(@Param("tenantId") String tenantId,
                                            @Param("businessDate") Date businessDate,
                                            @Param("loanType") String loanType,
                                            @Param("thirdChannel") String thirdChannel);

    BigDecimal sumByBusinessDateAndLoanTypeAndTxnCode(@Param("tenantId") String tenantId,
                                                      @Param("businessDate") Date businessDate,
                                                      @Param("loanType") String loanType,
                                                      @Param("txnCode") String txnCode,
                                                      @Param("thirdChannel") String thirdChannel);

    List<AmLoanMainInfo> selectByPostingDateAndLoanTypeForBatch(@Param("tenantId") String tenantId,
                                                                @Param("businessDate") Date businessDate,
                                                                @Param("loanType") String loanType,
                                                                @Param("thirdChannel") String thirdChannel);

    AmLoanMainInfo selectBySerialNumberAndLoanType(@Param("serialNumber") String serialNumber,
                                                   @Param("loanType") String loanType,
                                                   @Param("thirdChannel") String thirdChannel,
                                                   @Param("tenantId") String tenantId);


    /**
     * 统计指定时间区间内消费总额
     *
     * @param tenantId   租户号
     * @param customerId 客户号
     * @param startTime  开始时间
     * @param endTime    结束时间
     * @param loanType   借据类型
     * @return
     */
    BigDecimal sumByCustomerIdAndDateRangeAndLoanType(@Param("tenantId") String tenantId, @Param("customerId") String customerId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("loanType") String loanType, @Param("productId") String productId);

    /**
     * 借据信息统计（包含账单分期的订单）
     *
     * @param customerId
     * @param tenantId
     * @return
     */
    AmLoanMainInfo selectByCountCustomer(@Param("customerId") String customerId, @Param("tenantId") String tenantId);

    /**
     * 信用就医替换 --selectByCountCustomer
     * 借据信息统计（包含账单分期的订单）
     *
     * @param customerId
     * @param tenantId
     * @return
     */
    AmLoanMainInfo selectByCountCustomerWithProducts(@Param("customerId") String customerId, @Param("tenantId") String tenantId, @Param("productIds") List<String> productIds,@Param("businessDate") Date businessDate);

    /**
     * 查询首笔借据编号
     *
     * @param customerId
     * @param tenantId
     * @return
     */
    String selectMinLoanId(@Param("customerId") String customerId, @Param("tenantId") String tenantId);
    /**
     * 查询首笔借据编号
     *
     * @param customerId
     * @param tenantId
     * @param productIds
     * @return
     */
    String selectMinLoanIdWithProducts(@Param("customerId") String customerId, @Param("tenantId") String tenantId, @Param("productIds") List<String> productIds);

/**
    /**
     * 借据信息统计（包含正常和逾期的订单）
     *
     * @param customerId
     * @param tenantId
     * @return
     */
    AmLoanMainInfo selectByCountCustomer2(@Param("customerId") String customerId, @Param("tenantId") String tenantId);

    /**
     * 借据信息统计（包含正常和逾期的订单）
     *
     * @param customerId
     * @param tenantId
     * @return
     */
    AmLoanMainInfo selectByCountCustomer2WithProducts(@Param("customerId") String customerId, @Param("tenantId") String tenantId,
                                                      @Param("productIds") List<String> productIds);

    /**
     * 借据信息统计（不包含账单分期的订单）
     *
     * @param customerId
     * @param tenantId
     * @return
     */
    AmLoanMainInfo countLoanAmount(@Param("customerId") String customerId, @Param("tenantId") String tenantId);

    /**
     * 获取所有
     */
    List<String> selectDistincePenaltyTableId(@Param("customerId") String customerId, @Param("tenantId") String tenantId);

    /**
     * 获取所有
     */
    List<String> selectDistinctPenaltyTableIdWithProducts(@Param("customerId") String customerId, @Param("tenantId") String tenantId,
                                                          @Param("productIds") List<String> productIds);

    /**
     * 统计指定时间区间内消费总额大于指定值的总数（按客户id维度统计）
     *
     * @param tenantId  租户号
     * @param startTime 开始时间
     * @param endTime   开始时间
     * @param loanType  借据类型
     * @param sumAmount 指定金额
     * @return
     */
    Integer countDistinctlyGroupByCustomerId(@Param("tenantId") String tenantId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("loanType") String loanType, @Param("sumAmount") BigDecimal sumAmount, @Param("productId") String productId);

    /**
     * 统计特定时间内指定借据类型列表
     *
     * @param tenantId  租户号
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param loanType  借据类型
     * @return
     */
    AmLoanMainInfo sumByCustomerIdAndDateRangeAndLoanTypeForBatch(@Param("tenantId") String tenantId, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("loanType") String loanType, @Param("productId") String productId);

    /**
     * 根据交易日期（业务日期）分组查询贷款信息
     * @param tenantId
     * @param customerId
     * @return
     */
    List<AmLoanMainInfoVo> selectLoanInfoGroupByDay(@Param("tenantId") String tenantId, @Param("customerId") String customerId);

    /**
     * 信用就医替换  selectLoanInfoGroupByDay
     * 根据交易日期（业务日期）分组查询贷款信息
     * @param tenantId
     * @param customerId
     * @param productIds
     * @return
     */
    List<AmLoanMainInfoVo> selectLoanInfoWithProductsGroupByDay(@Param("tenantId") String tenantId, @Param("customerId") String customerId,
                                                                @Param("productIds") List<String> productIds);

    BigDecimal sumAmountByCustomerId(@Param("customerId") String customerId, @Param("tenantId") String tenantId, @Param("productId") String productId);

    /**
     * 信用就医替换 sumAmountByCustomerId
     * @param customerId
     * @param tenantId
     * @param productIds
     * @param etlEffectiveDate
     * @return
     */
    BigDecimal sumAmountByCustomerIdProducts(@Param("customerId") String customerId, @Param("tenantId") String tenantId, @Param("productIds") List<String> productIds, @Param("etlEffectiveDate") Date etlEffectiveDate);

    /**
     * 根据借据编号获取最大日利率
     * @param loanId
     * @param customerId
     * @param tenantId
     * @return
     */
    AmLoanMainInfo getMaxDailyRateByLoanId(@Param("loanId")String loanId, @Param("customerId")String customerId, @Param("tenantId")String tenantId);

    /**
     * 筛选特定贷款类型客户列表
     * @param tenantId
     * @param loanType
     * @param customerId
     * @return
     */
    List<AmLoanMainInfo> selectByCustomerIdAndLoanType(@Param("tenantId") String tenantId, @Param("customerId") String customerId, @Param("loanType") String loanType, @Param("productId") String productId);


    List<String> getAmLoanMainInfoByConsumeAmountWeekly(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("loanType") String loanType, @Param("sumAmount") BigDecimal sumAmount);

    /**
     * 根据产品号查询某个时间段的消费客户id
     * @param startTime
     * @param endTime
     * @return
     */
    List<AmLoanMainInfo> getLoanCustomerInfoByTime(@Param("productId") String productId, @Param("startTime") String startTime, @Param("endTime") String endTime);
    List<String> getAmLoanMainInfoByConsumeAmountWeekly(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("loanType") String loanType, @Param("sumAmount") BigDecimal sumAmount,@Param("productId") String productId);

    /**
     * 根据状态获取最后的还款日期
     * @param tenantId
     * @param customerId
     * @param statusList
     * @param productIds
     * @return
     */
    AmLoanMainInfo getLoaningLastPaymentDate(@Param("tenantId")String tenantId,
                                             @Param("customerId")String customerId ,
                                             @Param("statusList") List<String> statusList,
                                             @Param("productIds") List<String> productIds);

    /**
     * 信用就医替换  selectLoanInfoGroupByDay
     * 根据借据编号  交易日期（业务日期）分组查询贷款信息
     * @param tenantId
     * @param loanId
     * @param customerId
     * @param productIds
     * @return
     */
    List<AmLoanMainInfoVo> selectLoanInfoWithLoanIdProductsGroupByDay(@Param("tenantId") String tenantId,@Param("loanId") String loanId, @Param("customerId") String customerId,
                                                                @Param("productIds") List<String> productIds);

    AmLoanMainInfo selectMinInfo(@Param("customerId") String customerId, @Param("tenantId") String tenantId, @Param("productIds") List<String> productIds, @Param("businessDate") Date businessDate);
}